package com.tjetc.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class _13CreateObject {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        Class cls = Class.forName("com.tjetc.reflect._1Cat");


        Constructor constructor = cls.getDeclaredConstructor(String.class);
        System.out.println(constructor);

        // 如果调用私有的构造器就会抛出异常
//        Object o = constructor.newInstance("zhangsan");
//        System.out.println(o);

        // 解决: 暴力破解
        constructor.setAccessible(true);
        Object o = constructor.newInstance("zhangsan");
        System.out.println(o);

        Field age = cls.getDeclaredField("age");
        age.setAccessible(true);
        System.out.println("age.get(o) = " + age.get(o));

        Method f3 = cls.getDeclaredMethod("f3");
        f3.setAccessible(true);
        f3.invoke(o);

        /*
            使用场景：
            1.我们可以在类中或方法或字段上加上注解（这些注解一定是runtime运行时）
            2.写一个类 来反射，当运行时去获取该类 并且通过反射的相关方法获取到类上，方法上，字段上的注解
            3.进行判断如果存在执行对应逻辑 如果不存在执行另外一种逻辑

        */
    }
}
